/* SPDX-License-Identifier: BSD-3-Clause */

/*
 * Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd.
 */

#ifndef _HAL_DEF_H_
#define _HAL_DEF_H_

#include "Soc.h"

/* SOC OPS Marco */
#define SET_BIT(REG, BIT)     ((*(volatile uint32_t *)&(REG)) |= (BIT))
#define CLEAR_BIT(REG, MASK)  ((*(volatile uint32_t *)&(REG)) &= ~(MASK))
#define READ_BIT(REG, MASK)   ((*(volatile const uint32_t *)&(REG)) & (MASK))
#define CLEAR_REG(REG)        ((*(volatile uint32_t *)&(REG)) = (0x0))
#define WRITE_REG(REG, VAL)   ((*(volatile uint32_t *)&(REG)) = (VAL))
#define READ_REG(REG)         ((*(volatile const uint32_t *)&(REG)))
#define MODIFY_REG(REG, CLEARMASK, SETMASK) \
        WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
#define POSITION_VAL(VAL)  (__CLZ(__RBIT(VAL)))

#if defined (__GNUC__) || defined (__CC_ARM)
#define MASK_TO_WE(msk)  (__builtin_constant_p(msk) ? ((msk) > 0xFFFFU ? 0 : ((msk) << 16)) : ((msk) << 16))
#else
#define MASK_TO_WE(msk)  ((msk) << 16)
#endif
#define VAL_MASK_WE(msk, val)             ((MASK_TO_WE(msk)) | (val))
#define WRITE_REG_MASK_WE(reg, msk, val)  WRITE_REG(reg, (VAL_MASK_WE(msk, val)))

/* Misc OPS Marco */
#define HAL_MAX_DELAY  0xFFFFFFFFU

#define RESET  0
#define HAL_IS_BIT_SET(REG, MASK)  (((*(volatile uint32_t *)&(REG)) & (MASK)) != RESET)
#define HAL_IS_BIT_CLR(REG, MASK)  (((*(volatile uint32_t *)&(REG)) & (MASK)) == RESET)

#define HAL_BIT(nr)        (1UL << (nr))
#define HAL_ARRAY_SIZE(a)  (sizeof((a)) / sizeof((a)[0]))
#define HAL_MAX(x, y)      ((x) > (y) ? (x) : (y))
#define HAL_MIN(x, y)      ((x) < (y) ? (x) : (y))

#define HAL_DIV_ROUND_UP(x, y)  (((x) + (y) - 1) / (y))

#define HAL_IS_ALIGNED(x, a)  (((x) & (a - 1)) == 0)
#ifdef CACHE_LINE_SIZE
#define HAL_IS_CACHELINE_ALIGNED(x)  HAL_IS_ALIGNED((uint32_t)(x), CACHE_LINE_SIZE)
#else
#define HAL_IS_CACHELINE_ALIGNED(x)  HAL_IS_ALIGNED((uint32_t)(x), 4)
#endif

/* Compiller Macro */
#if defined (__GNUC__) || defined (__clang__) || defined (__CC_ARM) || defined (__ICCARM__)
#define HAL_UNUSED  __attribute__((__unused__))
#else
#define HAL_UNUSED
#endif

#ifdef CACHE_LINE_SIZE
#define HAL_CACHELINE_ALIGNED  __ALIGNED(CACHE_LINE_SIZE)
#else
#define HAL_CACHELINE_ALIGNED
#endif

#ifdef HAL_SRAM_SECTION_ENABLED
#define HAL_SECTION_SRAM_CODE    __attribute__((section(".sram_code")))
#define HAL_SECTION_SRAM_RODATA  __attribute__((section(".sram_rodata")))
#define HAL_SECTION_SRAM_DATA    __attribute__((section(".sram_data")))
#define HAL_SECTION_SRAM_BSS     __attribute__((section(".sram_bss")))
#else
#define HAL_SECTION_SRAM_CODE
#define HAL_SECTION_SRAM_RODATA
#define HAL_SECTION_SRAM_DATA
#define HAL_SECTION_SRAM_BSS
#endif

#ifdef HAL_PSRAM_SECTION_ENABLED
#define HAL_SECTION_PSRAM_CODE    __attribute__((section(".psram_code")))
#define HAL_SECTION_PSRAM_RODATA  __attribute__((section(".psram_rodata")))
#define HAL_SECTION_PSRAM_DATA    __attribute__((section(".psram_data")))
#define HAL_SECTION_PSRAM_BSS     __attribute__((section(".psram_bss")))
#else
#define HAL_SECTION_PSRAM_CODE
#define HAL_SECTION_PSRAM_RODATA
#define HAL_SECTION_PSRAM_DATA
#define HAL_SECTION_PSRAM_BSS
#endif

#ifdef HAL_XIP_SECTION_ENABLED
#define HAL_SECTION_XIP_CODE    __attribute__((section(".xip_code")))
#define HAL_SECTION_XIP_RODATA  __attribute__((section(".xip_rodata")))
#else
#define HAL_SECTION_XIP_CODE
#define HAL_SECTION_XIP_RODATA
#endif

typedef enum {
  HAL_SYSTICK_CLKSRC_CORE,
  HAL_SYSTICK_CLKSRC_EXT
} eHAL_systickClkSource;

#define IS_SYSTICK_SOURCE(s)  (((s) == HAL_SYSTICK_CLKSRC_CORE) || ((s) == HAL_SYSTICK_CLKSRC_EXT))

/***************************** Structure Definition **************************/
typedef enum {
  HAL_FALSE = 0x00U,
  HAL_TRUE  = 0x01U
} HAL_Check;

typedef enum {
  HAL_OK      = 0x00U,
  HAL_ERROR   = (-1),
  HAL_BUSY    = (-16),
  HAL_NODEV   = (-19),
  HAL_INVAL   = (-22),
  HAL_NOSYS   = (-38),
  HAL_TIMEOUT = (-110)
} HAL_Status;

typedef enum {
  HAL_DISABLE = 0x00U,
  HAL_ENABLE  = 0x01U
} HAL_FuncStatus;

typedef enum {
  HAL_UNLOCKED = 0x00U,
  HAL_LOCKED   = 0x01U
} HAL_LockStatus;

typedef enum {
  GPIO_BANK0 = 0,
  GPIO_BANK1 = 1,
  GPIO_BANK2 = 2,
  GPIO_BANK3 = 3,
  GPIO_BANK4 = 4,
  GPIO_BANK_NUM
} eGPIO_bankId;

typedef void (*pFunc)(
  void
  );

/***************************** Function Declare ******************************/

#endif
